import socket
import base64
import hashlib
import time
import struct

COD = 'utf-8'
HOST = 'localhost' # 主机ip
PORT = 9090 # 软件端口号
BUFSIZ = 1024
ADDR = (HOST, PORT)
SIZE = 10 

class mySocket:
  
    tcp_server_socket = None
    new_socket = None
    ip_port = None

    def __init__(self,host,port):
        # 1. 创建tcp服务端套接字对象
        self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 设置端口号复用，通俗理解程序退出端口号立即释放
        # 1. SOL_SOCKET表示当前套接字
        # 2. SO_REUSEADDR表示复用选项
        # 3. 是否复用，True表示复用
        self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
        # 2. 绑定端口号, "localhost"： 表示本机， 8989： 端口号
        self.tcp_server_socket.bind((host, port))
        # 3. 设置监听, 128: 表示最大等待的连接个数
        self.tcp_server_socket.listen(128)
        self.start()
      
    def start(self):
        while True:
            print("服务器启动，监听客户端链接")
            # 4. 等待接受客户的连接请求
            self.new_socket,self.ip_port = self.tcp_server_socket.accept()
            print("链接的客户端:", self.ip_port)
            
            while True:
                try:
                    data = self.new_socket.recv(BUFSIZ) # 读取已链接客户的发送的消息
                except Exception:
                    print("断开的客户端", self.ip_port)
                    break
                if not data:
                    print("断开的客户端", self.ip_port)
                    break
                print("客户端发送的内容:",data.decode(COD))
                # 对二进制数据进行解码
                msg = time.strftime("%Y-%m-%d %X") #获取结构化事件戳
                msg1 = '[%s]:%s' % (msg, data.decode(COD))
                self.new_socket.send(msg1.encode(COD)) #发送消息给已链接客户端
            

           
    def close(self):
        # 服务端的套接字关闭，不再提供连接服务
        self.tcp_server_socket.close()

    def send(self,content):
        # 对字符串进行编码
        data = content.encode(COD)
        # 发送给客户端的数据
        self.new_socket.send(data)
        # 关闭和客户端通信的socket
        self.new_socket.close()
        return True


if __name__ == '__main__':
    s = mySocket(HOST,PORT)